#include <QLabel>
#include <QMessageBox>
#include <QPushButton>
#include <QVBoxLayout>
#include <botan/base32.h>
#include <botan/exceptn.h>
#include <data_display/totpcreatewidnow.h>

namespace data_display {
TOTPConfigWindow::TOTPConfigWindow(QWidget *parent): QDialog(parent) {
	setWindowTitle("TOTP Configuration");

	auto *layout = new QVBoxLayout(this);
	auto *nameOfTotpLabel = new QLabel("Название одноразового пароля:", this);
	nameInput = new QLineEdit(this);
	layout->addWidget(nameOfTotpLabel);
	layout->addWidget(nameInput);
	auto *keyLabel = new QLabel("Секретный ключ:", this);
	keyInput = new QLineEdit(this);
	layout->addWidget(keyLabel);
	layout->addWidget(keyInput);

	auto *algorithmLabel = new QLabel("Алгоритм:", this);
	algorithmCombo = new QComboBox(this);
	algorithmCombo->addItems(QStringList() << "SHA-1" << "SHA-256" << "SHA-512");
	layout->addWidget(algorithmLabel);
	layout->addWidget(algorithmCombo);

	auto *digitsLabel = new QLabel("Длина пароля:", this);
	digitsCombo = new QComboBox(this);
	digitsCombo->addItems(QStringList() << "6" << "7" << "8");
	layout->addWidget(digitsLabel);
	layout->addWidget(digitsCombo);

	auto *periodLabel = new QLabel("Период обновления пароля (секунды):", this);
	periodInput = new QLineEdit(this);
	layout->addWidget(periodLabel);
	layout->addWidget(periodInput);
	periodInput->setText("30");

	auto *saveButton = new QPushButton("Сохранить", this);
	connect(saveButton, &QPushButton::clicked, this, &TOTPConfigWindow::saveConfig);
	layout->addWidget(saveButton);

	setLayout(layout);
}

void TOTPConfigWindow::saveConfig() {
	QString label = nameInput->text(); // You can modify this as needed
	std::string keyHex = keyInput->text().toStdString();
	QString algorithm = algorithmCombo->currentText();
	int digits = digitsCombo->currentText().toInt();
	int period = periodInput->text().toInt();

	if (label.isEmpty() || keyHex.empty() || algorithm.isEmpty() || digits == 0 || period == 0) {
		QMessageBox::warning(this, "Warning",
			"Заполните все поля");
		return;
	}

	// Check if the hex string has an even length
	if (keyHex.size() % 2 != 0) {
		QMessageBox::warning(this, "Warning", "Указан неверный секретный ключ. Длина ключа должна быть как минимум четная");
		return;
	}

	// Convert the hex string to byte vector
	Botan::secure_vector<uint8_t> keyData;
	try {
		keyData = Botan::base32_decode(keyHex);
		//keyData = Botan::hex_decode(keyHex);
	} catch (const Botan::Invalid_Argument&) {
		QMessageBox::warning(this, "Warning", "Не удалось декодировать base32 строку. Проверьте, что указан верный секртеный ключ");
		return;
	}
	Botan::SymmetricKey key(keyData);
	emit configSaved(label, key, algorithm, digits, period);
	close();
}

}
